//package com.yuan.spring.logAspect;
//
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//import org.springframework.stereotype.Component;
//
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * 日志统计aop
// * Created by 袁恩光 on 2017/11/29.
// */
//@Aspect
//@Component
//public class LogAspect {
//
//    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
//
//    @Autowired
//    private MongoTemplate mongoTemplate;
//
//    @Pointcut("execution( * com.yuan..*(..))")
//    public void pointCut() {
//
//    }
//
//    //@Around("pointCut()")
//    public Object logAop(ProceedingJoinPoint point) throws Throwable {
//        //传播方式判断 是否是step的log
//        boolean isJoin = false;
//        long startTime = 0L;
//        long totalTime = 0L;
//        String methodName = ((MethodSignature) point.getSignature()).getMethod().getName();
//        String className = point.getTarget().getClass().getSimpleName();
//        //判断是在执行step还是主log
//        if (LogTemp.LOG_MAIN_NAME.get() == null) {
//            isJoin = true;
//            //获取 TradeNo 类名 方法名 并放入线程变量
//            //log 头部信息拼接
//            StringBuilder sb = new StringBuilder();
//            sb.append("--[");
//            sb.append("TradeNo] ");
//            sb.append(className);
//            sb.append(" ");
//            sb.append(methodName);
//            sb.append(" ");
//            //保存到当前线程变量
//            LogTemp.LOG_MAIN_NAME.set(sb.toString());
//            //日志记录开始
//            logger.info(LogTemp.LOG_MAIN_NAME.get() + "log_Start_log--");
//            startTime = System.currentTimeMillis();
//            LogTemp.LOG_STEP.set(0);
//            LogTemp.LOG_STEP_TIME.set(startTime);
//            LogTemp.LOG_STEPS.set(new HashMap<>());
//        } else {
//            //step 执行的方法名
//            String name = LogTemp.LOG_MAIN_NAME.get() + methodName + " ";
//            LogTemp.LOG_MAIN_NAME.set(name);
//        }
//        //执行方法
//        Object object = point.proceed();
//        if (!isJoin) {
//            //step log
//            long stepTime = System.currentTimeMillis();
//            //记录step日志
//            int step = LogTemp.LOG_STEP.get() + 1;
//            LogTemp.LOG_STEP.set(step);
//            long diffTime = stepTime - LogTemp.LOG_STEP_TIME.get();
//            LogTemp.LOG_STEP_TIME.set(stepTime);
//            logger.info(LogTemp.LOG_MAIN_NAME.get() + "step" + step + " use times:" + diffTime + "--");
//            //移除 step 所用的方法名
//            String name = LogTemp.LOG_MAIN_NAME.get().replace(methodName, "");
//            LogTemp.LOG_MAIN_NAME.set(name.trim() + " ");
//            //收集step日志
//            LogTemp.LOG_STEPS.get().put("step" + step + methodName, diffTime);
//        } else {
//            //主log log结束
//            totalTime = System.currentTimeMillis() - startTime;
//            logger.info(LogTemp.LOG_MAIN_NAME.get() + "log_End_log TotalTimes:" + totalTime + "--");
//            //保存或更新日志记录
//            this.saveMethod(className, methodName, totalTime);
//            //保存step日志
//            this.saveSteps(className, methodName);
//            //清除所有log 线程变量
//            LogTemp.LOG_MAIN_NAME.remove();
//            LogTemp.LOG_STEP.remove();
//            LogTemp.LOG_STEP_TIME.remove();
//            LogTemp.LOG_STEPS.remove();
//        }
//        return object;
//    }
//
//    /**
//     * 对主log的记录操作
//     */
//    private void saveMethod(String className, String methodName, Long totalTime) {
//        String key = "methodName";
//        Query query = new Query();
//        query.addCriteria(Criteria.where(key).is(className + methodName));
//        LogMongo logMongo = mongoTemplate.findOne(query, LogMongo.class);
//        if (null == logMongo) {
//            logMongo = new LogMongo();
//            logMongo.setMethodName(className + methodName);
//            logMongo.setTimes(1L);
//            logMongo.setTotalUseTimes(totalTime);
//            logMongo.setAverageTimes(logMongo.getTotalUseTimes() / logMongo.getTimes());
//            mongoTemplate.insert(logMongo);
//        } else {
//            logMongo.setTimes(logMongo.getTimes() + 1L);
//            logMongo.setTotalUseTimes(logMongo.getTotalUseTimes() + totalTime);
//            logMongo.setAverageTimes(logMongo.getTotalUseTimes() / logMongo.getTimes());
//            Update update = new Update();
//            update.set("times", logMongo.getTimes());
//            update.set("totalUseTimes", logMongo.getTotalUseTimes());
//            update.set("averageTimes", logMongo.getAverageTimes());
//            mongoTemplate.upsert(query, update, LogMongo.class);
//        }
//    }
//
//    /**
//     * 对step 日志的记录操作
//     */
//    private void saveSteps(String className, String methodName) {
//        LogMongoStep logMongoStep = new LogMongoStep();
//        logMongoStep.setMethodName(className + methodName);
//        Map<String, Long> steps = LogTemp.LOG_STEPS.get();
//        if (steps.size() > 0) {
//            logMongoStep.setSteps(LogTemp.LOG_STEPS.get());
//            mongoTemplate.insert(logMongoStep);
//        }
//    }
//
//}
